Введение в детали проекта

Описание проекта и стоящей перед нами задачи

Перед нами стоит задача, с которой могут столкнуться различные фотохостинги для профессиональных фотографов. Пользователи таких платформ размещают свои фотографии и сопровождают их подробными описаниями: указывают место съемки, модель камеры и другие детали. Существуют такие сервисы, где описания могут добавлять не только авторы фотографий, но и другие пользователи. Пример описания: "A hiker poses for a picture in front of stunning mountains and clouds." Кейс подобной компании мы и постараемся решить.

Мы планируем провести эксперимент по созданию поиска референсных фотографий для фотографов. Идея заключается в том, что пользователь вводит описание нужной сцены, например, "A man is crossing a mountain pass on a metal bridge." Сервис должен предоставить несколько фотографий с аналогичной или похожей сценой. Для этого нам нужно реализовать Proof of Concept (PoC) — доказательство концепции, которое покажет, что проект можно осуществить, создав демонстрационную версию поиска изображений по текстовым запросам.

Для демонстрационной версии необходимо выбрать наилучшую модель, которая сможет создать векторное представление изображений и текстов, и на основе этого выдавать оценку от 0 до 1, показывающую степень соответствия текста и изображения. Эта модель будет основой для создания предварительной версии продукта.

Также необходимо учитывать юридические ограничения. В некоторых странах, где могут работать компании, действуют законы, запрещающие без разрешения родителей или законных представителей предоставлять любую информацию, включая тексты, изображения, видео и аудио, содержащие данные о детях. Под ребенком понимается любой человек моложе 16 лет.

Мы строго соблюдаем законы стран, в которых работаем. Поэтому при попытке посмотреть изображения, запрещенные законодательством, будет отображаться уведомление: "This image is unavailable in your country in compliance with local laws." Однако в PoC этот функционал будет недоступен, поэтому важно очистить данные от запрещенного контента. Во время тестирования модели при наличии "вредного" контента должен отображаться соответствующий дисклеймер.

Описание данных

В файле train_dataset.csv находится информация, необходимая для обучения: имя файла изображения, идентификатор описания и текст описания. Для одной картинки может быть доступно до 5 описаний. Идентификатор описания имеет формат <имя файла изображения>#<порядковый номер описания>.

В папке train_images содержатся изображения для тренировки модели.

В файле CrowdAnnotations.tsv — данные по соответствию изображения и описания, полученные с помощью краудсорсинга. Номера колонок и соответствующий тип данных:

  1. Имя файла изображения.
  2. Идентификатор описания.
  3. Доля людей, подтвердивших, что описание соответствует изображению.
  4. Количество человек, подтвердивших, что описание соответствует изображению.
  5. Количество человек, подтвердивших, что описание не соответствует изображению.

В файле ExpertAnnotations.tsv содержатся данные по соответствию изображения и описания, полученные в результате опроса экспертов. Номера колонок и соответствующий тип данных:

  1. Имя файла изображения.
  2. Идентификатор описания.

3, 4, 5 — оценки трёх экспертов.

Эксперты ставят оценки по шкале от 1 до 4, где 1 — изображение и запрос совершенно не соответствуют друг другу, 2 — запрос содержит элементы описания изображения, но в целом запрос тексту не соответствует, 3 — запрос и текст соответствуют с точностью до некоторых деталей, 4 — запрос и текст соответствуют полностью.

В файле test_queries.csv находится информация, необходимая для тестирования: идентификатор запроса, текст запроса и релевантное изображение. Для одной картинки может быть доступно до 5 описаний. Идентификатор описания имеет формат <имя файла изображения>#<порядковый номер описания>.

В папке test_images содержатся изображения для тестирования модели.

Импорт необходимых фреймворков и фиксация констант

Выгрузка и исследовательский анализ данных

Первичный осмотр содержимого данных и формулирование методов для правки

Разделим наш столбец query_id на два столбца, в одном будет ссылка на изображение, а в другом - порядковый номер описания. Так мы сможем корректно отслеживать число описаний для одного изображения.

Как мы видим, в тренировочных данных неверная разметка обозначения номера описания, везде содержится 2, хотя этого не может быть. Поэтому мы сгруппируем данные по названию картинки image, а дальше пронумеруем все номера описания. В виду условия, что может быть не более 5 описаний, то удалим лишние.

Сделаем это после того, как удалим описания неподподающими под цензуру региона.

В данных нет ни одного пропуска, значит, продолжим.

EDA - анализ данных

Описательные статистики

Как видно из распределений наибольшое число оценок составляют 1, а наименьшее 4.

Также видно, что первый эксперт более критично оценивает сходства. Третий, наоборот - самый лояльный. Второй выставляет наиболее сбалансированные оценки.


Как видно из распределений, для фотографий и запросов на порядок больше оценок из краудсорсинга, что дает большой массив дополнительной информации для нас.

Однако как видно из способа оценивания, то эти данные будут сильно вредить модели, потому что данные оценки имели только значение ноль или один и не подразумевали значения между, что сильно уменьшает точность оценки принадлежности картинки к описанию.

А раз оценки экспертов имеют аж 4 категории, это добавляет точности к определению принадлежности. Позже мы создадим агрегированную оценку экспертов, лежащую в диапазоне от 0 до 1, чтобы можно было использовать на выходных слоях нейросетей сигмоидальную функцию.

Поэтому в будущем будем использовать оценки именно от экспертов.

Анализ количества уникальных фото и запросов

Как можно заменить, у нас довольно разнородные данные. Для каждой фотографии представлены различные текстовые запросы и фотографии для этих запросов, что даст нам неплохую информацию для обучения моделей.

Также в данных видна запрещенные в нашем регионе слова для запросов, например "young", "boy" их мы удалим позже.

В тестовом датасете видно, что представлены одинаковые фотографии для рекомендации и для запроса, это может говорить о том, что таким образом можно проверить работу нашей модели, проверяя результаты вывода с табличными данными.

Также в тесте из 500 записей только 100 уникальных фотографий, а вот запросов ровно 500, что позволит оценивать нашу модель более качественно.

Просмотр фотографий

Взглянем на рандомные фотографии, которые входят в наши датасеты.

В наших данных содержатся фотографии с запрещенным контентом, позже нам будет необходимо удалить запросы, которые могут вести на данные картинки, чтобы не нарушать действующее законодательство.

Создание агрегированной оценки специалистов и краудсорсинга

Наш датасет содержит экспертные и краудсорсинговые оценки соответствия текста и изображения.

В файле с экспертными мнениями для каждой пары изображение-текст имеются оценки от трёх специалистов. Для решения задачи вы должны эти оценки агрегировать — превратить в одну. Существует несколько способов агрегации оценок, самый простой — голосование большинства: за какую оценку проголосовала большая часть экспертов (в нашем случае 2 или 3), та оценка и ставится как итоговая. Поскольку число экспертов меньше числа классов, может случиться, что каждый эксперт поставит разные оценки, например: 1, 4, 2. В таком случае данную пару изображение-текст можно исключить из датасета.

Итоговая оценка экспертов

Получение суммарной оценки из мнения экспертов и информации от краудсорсинга

Вы можете воспользоваться другим методом агрегации оценок или придумать свой.

В файле с краудсорсинговыми оценками информация расположена в таком порядке:

  1. Доля исполнителей, подтвердивших, что текст соответствует картинке.
  2. Количество исполнителей, подтвердивших, что текст соответствует картинке.
  3. Количество исполнителей, подтвердивших, что текст не соответствует картинке.

Однако учитывая, что выбор между значениями соответствует и не соответствует на краудсорсинге хуже того, как оценки выставляли эксперты в диапазоне целых чисел от 1 до 4. Плюс ко всему, на краудсорсинге есть фотографии, за которые проголосовало, например, 2 человека, а есть за которые проголосовало 20, поэтому такие данные могут содержать приличное число выбросов. Также стоит отметить, что число оценок с краудсорсинга почти в 2 раза меньше, чем тех же самых оценок экспертов, и при дальнейших объединениях таблиц мы потеряем большую часть данных.

Поэтому добавление в итоговую оценку мнений краудсорсинга с большей вероятностью ухудшит качество данных ввиду перечисленных выше факторов. Значит, будем использовать только оценки экспертов.

В начале соединим наши тренировочные и экспертные данные.

Объединять их будет по трем столбцам: image и query_id, так как именно для таких пар выставлялись оценки по сходству между изображением запроса и исходником; serial_number_query, чтобы не создавались лишние дубликаты столбцов, так как из анализа в прошлом разделе мы увидели, что значения этого столбца все равны 2-м.

В качестве метода объединения выберем INNER JOIN, так как нам важно, чтобы для всех пар из тренировочного датасета были оценки из экспертного датафрейма и были текстовые описания, которых нет в датасете с оценками.

Проверка данных

В некоторых странах, где работает наша компания, действуют ограничения по обработке изображений: поисковым сервисам и сервисам, предоставляющим возможность поиска, запрещено без разрешения родителей или законных представителей предоставлять любую информацию, в том числе, но не исключительно тексты, изображения, видео и аудио, содержащие описание, изображение или запись голоса детей. Ребёнком считается любой человек, не достигший 16 лет.

В нашем сервисе строго следуют законам стран, в которых работают. Поэтому при попытке посмотреть изображения, запрещённые законодательством, вместо картинок показывается дисклеймер:

This image is unavailable in your country in compliance with local laws

Однако у нас в PoC нет возможности воспользоваться данным функционалом. Поэтому все изображения, которые нарушают данный закон, нужно удалить из обучающей выборки.


Проверим есть ли у нас такие записи, для которых число описаний более 5.

Так как у нас не было пронумеровано число описаний, следовательно, сейчас нам необходимо сгруппировать описания по картинкам.

Очистка текста от лишних символов

Выделение признаков и целевых значений в отдельные фрэймы данных

Выделим основные фичи необходимые для обучения моделей и предсказания таргетов.

Векторизация изображений

Перейдём к векторизации изображений.

Самый примитивный способ — прочесть изображение и превратить полученную матрицу в вектор. Такой способ нам не подходит: длина векторов может быть сильно разной, так как размеры изображений разные. Поэтому стоит обратиться к свёрточным сетям: они позволяют "выделить" главные компоненты изображений.

Выберем архитектуру ResNet-18, предварительно натренированную на датасете ImageNet, так как она показывала хорошие значения accuracy при детекции объектов на изображении, согласно официальной документации. Конечно, ResNet-52 согласно той же документации выдает более крутые значения, все же остановимся на данной модели ввиду меньшего выводимого вектора.

Также нам будет необходимо удалить последний полносвязный слой с предсказанием, чтобы нам выводился именно вектор, а не предсказание.

Нам необходимо исключить из данной модели последние два слоя AdaptiveAvgPool2d и Linear, чтобы получить именно эмбэддинги фотографий.

Проверим правильно ли произошла векторизация изображения сравнив между собой вектора для одинаковых и разных изображений.

Первая картинка отличается от двух других, которые в свою очередь являются одинаковыми, и это видно по векторам. Значит, векторизация фотографий прошла успешно.

Векторизация текстов

Следующий этап — векторизация текстов. В качестве векторизатора будем использовать DistilBert, так как он выдает меньший вектор по сравнению с стандартной моделью BERT, не сильно уступая в точности. Для нас это важнее, так как при большой разнице в размерах между эмбэдингами текста и картинками модели могут упускать часть признаков.

Токенезация

После токенизации tokenized представляет собой список предложений - каждое предложение представлено в виде списка токенов. Мы хотим, чтобы BERT обрабатывал все наши примеры сразу одним пакетом. Это ускорит нашу обработку. По этой причине нам нужно привести все списки к одинаковому размеру, чтобы мы могли представить входные данные в виде одного двумерного массива, а не списка списков разной длины.

Для корректной работы нашей модели создадим маску, чтобы нулевые значения не мешали выводам BERT'a.

Объединение векторов

Подготовьте данные для обучения: объедините векторы изображений и векторы текстов с целевой переменной.

Обучение модели предсказания соответствия

Для обучения разделим датасет на тренировочную и валидационные выборки, исключив попадание изображения и в обучающую, и в тестовую выборки.

Мы будем использовать константную модель, линейную регрессию, Ridge, Lasso и полносвязную нейронную сеть. В данной задаче деревянные модели наврядли покажут приемлимые результаты, так как число признаков большое и модели могут очень быстро переобучиться.

Так как у нас стоит задача предсказывания вероятности в диапазоне [0; 1], где важна устойчивость к аномальным значениям и равномерное воздействие на ошибки, то выберем MAE в качестве метрики качества работы моделей.

Разделение выборки на тренировочную и валидационную.

Стандартизация признаков

DummyRegressor

Linear Regression

Lasso Regression

Ridge Regression

Полносвязная нейронная сеть

Вывод по моделям, обученным на тренировочных данных и протестированных на валидационных

Мы обучили несколько моделей, основанных на константных значениях, полносвязной нейронки, линейной регрессии и её модификациях. В результате благодаря тесту на валидационных данных мы выяснили, что именно модель NN показывает наилучшие значения метрики MAE, равные ~0.06, что можно отнести к неплохим результатам.

В ходе обучения была замечена мультиколлениарность признаков, на это указали слишком высокие метрики линейной регрессии, а вот ее модификации, использующие регуляризацию, смогли невилировать эффект, происходящий из-за особенности векторизации текстов и изображений с помощью pytorch. Поэтому, скорее всего, ввиду наименьшей подвержности мультиколлениарности со стороны нейронной сети она и выдала наилучшие результаты при сравнении картинок и описаний.

Тестирование модели

Настало время протестировать модель. Для этого мы получим эмбеддинги для всех тестовых изображений из папки с тестовыми изображениями, выберем случайные 10 запросов из файла с тестовыми запросами и для каждого запроса выведем наиболее релевантное изображение. Также обязательно сравним визуально качество поиска.

Общие рекомендации и финальный вывод

Рекомендации:

  1. Сделать обязательным условием, чтобы не только у оценок экспертов по сходству было одинаковое число голосов за картинку, но чтобы и число краудсорсеров проголосовавших за определенную картинку было хотя бы не меньше определенного фиксированного числа. Данна рекомендация поможет избежать аномальных значений в создании агрегированной метрики;

  2. Также лучшем решением было бы внедрение для краудсорсинга такой же шкалы оценивания, как и у экспертов (значения 1, 2, 3, 4), а не просто соответствует/отличается. Таким образом финальная метрика смогла бы оказаться более точной и полезной для обучения новой модели;

  3. Увеличить привлекаемых краудсорсеров, так как в имеющихся на настоящий момент данных число записей в оценках с краудсорса в два раза меньше, чем записей с оценками экспертов;

  4. Создать метрику оценки сходства изображений, опираясь на мнение экспертов и краудсорсинга, чтобы она наиболее точно отражала меры сходства. Данную задачу можно поручитьинженерам данных, чтобы получилась наиболее выверенная оценка;


Вывод:

В рамках проекта был создан MVP для системы поиска изображений по фотографии.

В ходе работы для векторизации изображений использовалась предобученная на ImageNet архитектура ResNet-18, а для текстовых эмбеддингов - также предобученный DistilBert. Проанализировали и выбрали лучшую оценку схожести картинки и запроса, плюс подобрали метрику качества для обучения и теста моделей.

После объединения признаков и выделения таргетов (экспертные оценки схожести описания и картинок), было произведено исследование трех моделей для оценки схожести:

Наилучший результат показала нейронная сеть, с которой и проводилось тестирование.

В рамках теста была создана функция, преобразующая тестовые запросы и картинки в эмбэдинги, после проверяющая соблюдение юридической стороны запросом, а после выводящая самую похожую на описание картинку с помощью обученной модели NN.

Наша модель полносвязной нейронной сети показала отличные результаты на валидационной выборке с результатом MAE = 0.06 и неплохие на тестовой выборке, однако имеют место недочёты. НС неплохо выделяет основные слова из текста и ищет их соответствия на картинках. Да, бывает она может прицепится только к какой-то одной отдельной детали из описания и выдать картинки связанные тематически, но в мере сходства она отразит низкий процент соответствия картинки и описания. Значит, наша модель всё-таки неплохо работает. И ее можно пробовать выпускать в продакшн.

Для более точных результатов необходимо применить рекомендации выше при подготовке данных, также улучшить показатели сети могло бы увеличение предоставленных данных как для тренировки, так и для тестирования.